package com.gqh.weather.controller;

import com.gqh.weather.domain.dto.*;
import com.gqh.weather.domain.entity.Paper;
import com.gqh.weather.exception.Result;
import com.gqh.weather.service.PaperService;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 试卷管理控制器
 *
 * @author AI
 * @date 2025-10-20
 */
@Slf4j
@Validated
@RestController
@RequestMapping("/pingjia/zh/v1/xy_paper")
@RequiredArgsConstructor
public class PaperController {

    private final PaperService paperService;

    /**
     * 查询试卷详情
     * 路径: GET /pingjia/zh/v1/xy_paper/info
     *
     * @param id 试卷ID
     * @return 试卷详情（包含解析后的试卷内容）
     */
    @GetMapping("/info")
    public Result<PaperInfo> info(@RequestParam @NotNull(message = "id不能为空") Integer id) {
        log.info("查询试卷详情请求: id={}", id);
        return paperService.getPaperInfo(id);
    }

    /**
     * 创建试卷
     * 路径: POST /pingjia/zh/v1/xy_paper/create
     *
     * @param request 创建请求
     * @return 操作结果
     */
    @PostMapping("/create")
    public Result<Void> create(@Valid PaperCreateRequest request) {
        log.info("创建试卷请求: name={}, type={}", request.getName(), request.getType());
        return paperService.createPaper(request);
    }

    /**
     * 自动组卷
     * 路径: POST /pingjia/zh/v1/xy_paper/create
     *
     * @param request 随机请求
     * @return 操作结果
     */
    @PostMapping("/random")
    public Result<Void> random(@Valid PaperRandomRequest request) {
        log.info("随机试卷请求: name={}, type={}", request.getName(), request.getType());
        return paperService.randomPaper(request);
    }

    /**
     * 更新试卷
     * 路径: POST /pingjia/zh/v1/xy_paper/update
     *
     * @param request 更新请求
     * @return 操作结果
     */
    @PostMapping("/update")
    public Result<Void> update(@Valid PaperUpdateRequest request) {
        log.info("更新试卷请求: id={}, name={}", request.getId(), request.getName());
        return paperService.updatePaper(request);
    }

    /**
     * 删除试卷
     * 路径: POST /pingjia/zh/v1/xy_paper/delete
     *
     * @param id 试卷ID列表（支持多个id参数）
     * @return 操作结果
     */
    @PostMapping("/delete")
    public Result<Void> delete(@RequestParam List<Integer> id) {
        log.info("删除试卷请求: ids={}", id);
        return paperService.deletePapers(id);
    }

    /**
     * 发布/取消发布试卷
     * 路径: POST /pingjia/zh/v1/xy_paper/publish
     *
     * @param request 发布请求
     * @return 操作结果
     */
    @PostMapping("/publish")
    public Result<Void> publish(@Valid PublishRequest request) {
        log.info("发布试卷请求: id={}, flag={}", request.getIds(), request.getFlag());
        return paperService.publishPaper(request.getIds(), request.getFlag());
    }

    /**
     * 查询试卷列表
     * 路径: GET /pingjia/zh/v1/xy_paper/list
     *
     * @param page       页码（默认1）
     * @param count      每页数量（默认20）
     * @param type       学科ID（可选）
     * @param if_publish 发布状态（0全部 1已发布 2未发布，可选）
     * @param keyword    搜索关键字（可选）
     * @return 分页结果
     */
    @GetMapping("/list")
    public Result<MyPage<PaperListData>> list(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "20") Integer count,
            @RequestParam(required = false) Integer type,
            @RequestParam(required = false) Integer if_publish,
            @RequestParam(required = false) String keyword) {

        PaperListRequest request = new PaperListRequest();
        request.setPage(page);
        request.setCount(count);
        request.setType(type);
        request.setIfPublish(if_publish);
        request.setKeyword(keyword);

        log.info("查询试卷列表请求: page={}, count={}, type={}, if_publish={}, keyword={}",
                page, count, type, if_publish, keyword);
        return paperService.listPapers(request);
    }
}
